import { message } from "antd";
import axios from "axios";
import { getToken, removeToken } from "./token";
import router from "@/router";

// 创建请求示例对象
const request = axios.create({
  // 请求的基础路径
  baseURL: "http://geek.itheima.net/v1_0",
  // 超时时间
  timeout: 5000,
});

// 请求拦截器(请求发送前做拦截,配置一些自定义请求参数)
request.interceptors.request.use((config) => {
  // 在请求头中添加token(按照后端的格式进行拼接)
  // 获取本地存储中的token
  let token = getToken();
  // 如果本地存储中有token将其添加到请求头中(用于标识用户是否已经登录)
  if (token) config.headers.Authorization = "Bearer " + token;
  // 返回配置对象
  return config;
});

// 响应拦截器(在响应返回到客户端前做拦截,处理返回的数据)
request.interceptors.response.use(
  // 2xx 范围内的状态码都会触发该函数。
  (response) => {
    // 简化返回数据(axios 会对返回的数据进行二次封装)
    return response.data;
  },
  // 超出 2xx 范围的状态码都会触发该函数。
  (error) => {
    // 判断响应状态码是否为 401(token失效)
    if (error.response.status === 401) {
      // 清除失效token返回登录页
      removeToken();
      // 跳转到登录页
      router.navigate("/login");
      // 刷新页面(防止页面为刷新，清除store中的数据)
      window.location.reload();
    }
    // 提示错误信息
    message.error(error.response.data.message);
    // 返回失败的 Promise 对象 终止请求(axios返回一个Promise)
    return Promise.reject(error);
  }
);

// 暴露请求对象
export default request;
